package com.ui.listeners;

import org.apache.log4j.Logger;
import org.testng.IRetryAnalyzer;
import org.testng.ITestResult;


/**
 * 自定义TestRetry类实现IRetryAnalyzer接口，来完成重跑机制
 * @author Administrator
 *
 */
public class TestngRetry implements IRetryAnalyzer{
	//初始化log4j日志对象
	private Logger logger = Logger.getLogger(TestngRetry.class);
	//最大重试次数的限制
	private int maxRetryCount = 2;
	//当前的重试次数
	public static int retryCount=1;
	// 初始化ThreadLocal对象来保证程序的线程安全问题，以免TestNg进行多线程并发的安全问题
	public static ThreadLocal<Integer> threadRetryLocal = new ThreadLocal<Integer>();
	@Override
	public boolean retry(ITestResult result) {
		// TODO Auto-generated method stub
		//设置限制条件，让testNG retry在满足条件的情况采取执行重试机制
		retryCount=getRetryCount();
		if(retryCount<=maxRetryCount){
			//返回true表示执行重试机制
			logger.info("开始第【"+retryCount+"】次重试机制,测试方法为:"+result.getName());
			retryCount++;
			//将变化之后的retryCount存放到threadLocal中去
			setRetryCount(retryCount);
			return true;
		}
		//返回false的话表示不执行重试机制
		return false;
	}
	//解决testng和dataprovider冲突：
	//1、升级testng版本到6.11+
	//2、在每条测试数据执行完毕之后（不管是成功还是失败都需要将retryCount初始化为1）
	
	/**
	 * 从threadLocal里面取得retryCount，避免多线程安全问题
	 * @return
	 */
	public static int getRetryCount(){
		return threadRetryLocal.get();
	}
	
	public static void setRetryCount(int retryCount){
		threadRetryLocal.set(retryCount);
	}

}
